package designpatterns.behavior;

/**
 * 命令模式：将一个请求封装为一个对象，使发出请求的责任和执行请求的责任分割开。
 * 这样两者之间通过命令对象进行沟通，这样方便将命令对象进行储存、传递、调用、增加与管理。
 * 顺序：调用者→接受者→命令。
 * 优点：1、降低了系统耦合度； 2、新的命令可以很容易添加到系统中去。
 * 缺点：使用命令模式可能会导致某些系统有过多的具体命令类。
 *
 * @author jack.wu
 * @since 2019/10/29 17:33
 */
public class Command {

    public static void main(String[] args) {

        Order order = new BuyStock(new Stock());
        order.execute();
    }
}

interface Order {

    /**
     * 执行方法
     */
    void execute();

}

class Stock {

    /**
     * 物品名称
     */
    private String name = "XX物品";
    /**
     * 物品数量
     */
    private Integer quantity = 10;

    /**
     * 买
     */
    public void buy() {
        System.out.println("Stock [ Name: " + name + ", Quantity: " + quantity + " ] bought");
    }

    /**
     * 卖
     */
    public void sell() {
        System.out.println("Stock [ Name: " + name + ", Quantity: " + quantity + " ] sold");
    }
}


class BuyStock implements Order {

    private Stock stock;

    public BuyStock(Stock stock) {
        this.stock = stock;
    }

    @Override
    public void execute() {
        stock.buy();
    }
}

class SellStock implements Order {

    private Stock stock;

    public SellStock(Stock stock) {
        this.stock = stock;
    }

    @Override
    public void execute() {
        stock.sell();
    }
}
